package net.jgrm.common.db.handler;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import net.jgrm.common.db.entity.BaseEntity;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

/**
 * MyBatis-Plus 元对象处理器
 * 用于自动填充 BaseEntity 中的公共字段
 *
 * @author: houyong
 * @date: 2025年09月19日
 */
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    /**
     * 插入操作时自动填充
     *
     * @param metaObject 元对象
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        // 如果是 BaseEntity 的子类
        if (metaObject.getOriginalObject() instanceof BaseEntity) {
            BaseEntity entity = (BaseEntity) metaObject.getOriginalObject();

            // 获取当前时间
            LocalDateTime now = LocalDateTime.now();

            // 填充创建时间
            this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, now);
            // 填充更新时间
            this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, now);
            // 填充逻辑删除标记（默认为0表示未删除）
            this.strictInsertFill(metaObject, "deleted", Integer.class, 0);
            // 填充版本号（默认为1）
            this.strictInsertFill(metaObject, "version", Integer.class, 1);

            // TODO: 实际项目中需要从上下文获取当前用户ID
            // 这里暂时设置为0，实际使用时需要替换为真实的用户ID获取逻辑
            Long currentUserId = getCurrentUserId();
            if (currentUserId != null) {
                this.strictInsertFill(metaObject, "createBy", Long.class, currentUserId);
                this.strictInsertFill(metaObject, "updateBy", Long.class, currentUserId);
            }

            // TODO: 实际项目中需要从上下文获取当前租户ID
            // 这里暂时设置为1，实际使用时需要替换为真实的租户ID获取逻辑
            this.strictInsertFill(metaObject, "tenantId", Long.class, 1L);
        }
    }

    /**
     * 更新操作时自动填充
     *
     * @param metaObject 元对象
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        // 如果是 BaseEntity 的子类
        if (metaObject.getOriginalObject() instanceof BaseEntity) {
            // 更新更新时间
            this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());

            // TODO: 实际项目中需要从上下文获取当前用户ID
            // 这里暂时设置为0，实际使用时需要替换为真实的用户ID获取逻辑
            Long currentUserId = getCurrentUserId();
            if (currentUserId != null) {
                this.strictUpdateFill(metaObject, "updateBy", Long.class, currentUserId);
            }
        }
    }

    /**
     * 获取当前登录用户ID
     * 实际项目中需要从安全上下文、ThreadLocal等获取
     *
     * @return 当前用户ID
     */
    private Long getCurrentUserId() {
        // 示例实现，实际项目中需要替换为真实的用户ID获取逻辑
        // 例如：SecurityContextHolder.getContext().getAuthentication().getPrincipal()
        // 或从ThreadLocal中获取：UserContext.getCurrentUser().getId()
        return 0L; // 这里返回0作为默认值
    }
}